﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC_Hotel.Repositorio;
using TCC_Hotel.Entidades;
using System.Web.Caching;
using TCC_Hotel.Serviços.OtherServices;

namespace TCC_Hotel.Serviços.BDServices
{
    public class ContaService
    {
        ContaRepositorio repositorio = new ContaRepositorio();

        /// <summary>
        /// Recupera o total da conta de um hospede
        /// </summary>
        /// <param name="CPF">ID da reserva</param>
        /// <returns>Total da conta do hospede</returns>
        public double RecuperarTotalConta(int ID)
        {
            return repositorio.RecuperarTotalConta(ID);
        }

        /// <summary>
        /// Recupera o total da conta que o hospede pagou no momento do check-out
        /// </summary>
        /// <param name="CPF">ID da reserva</param>
        /// <returns>Total da conta paga pelo hospede</returns>
        public double RecuperarTotalContaPagaCheckOut(int ID)
        {
            return repositorio.RecuperarTotalContaPagaCheckOut(ID);
        }

        /// <summary>
        /// Recupera todas as contas de um hóspede
        /// </summary>
        /// <param name="CPF">ID da reserva</param>
        /// <returns>lista com as contas</returns>
        public List<Conta> RecuperarVendasProdutoFluxo(int apartamento)
        {
            FluxoHospedesService servico_Fluxo = new FluxoHospedesService();
            Fluxo_Hospedes fluxoAtual = servico_Fluxo.ListarFluxoHospedesAgoraCache().Where(i => i.Numero_Apartamento == apartamento && i.NoHotel == true).FirstOrDefault();

            return ListarVendasProdutosAtivosCache().Where(i => i.ID == fluxoAtual.ID).ToList();
        }

        /// <summary>
        /// Recupera todas as vendas de produtos ativos
        /// </summary>
        /// <returns>lista com as contas</returns>
        public List<Conta> RecuperarVendasProduto()
        {
            return repositorio.RecuperarVendasProduto();
        }

        /// <summary>
        /// Verifica se a informação ja esta gravada em cache, se tiver recupera, 
        /// senao faz a consulta e grava em cache
        /// </summary>
        /// <returns>Lista de empresas autorizadas</returns>
        public List<Conta> ListarVendasProdutosAtivosCache()
        {
            List<Conta> contas = new List<Conta>();

            //Verifica se a informação esta guardada em cache
            if (HttpContext.Current.Cache.Get("Lista_Venda_Ativo") == null)
            {
                //Consulta as empresas no banco
                contas = RecuperarVendasProduto();

                //Armazena a lista de empresas em cache de 1 minuto para evitar muitas consultas ao banco
                HttpContext.Current.Cache.Add("Lista_Venda_Ativo", contas, null,
                                 DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration, CacheItemPriority.High, null);

            }

           //caso essa informaçao ja estiver no cache
            else
            {
                //Resgata informação do cache
                contas = (List<Conta>)HttpContext.Current.Cache.Get("Lista_Venda_Ativo");

            }

            return contas;
        }

        /// <summary>
        /// Serviço para calcular o preço da venda
        /// </summary>
        /// <param name="funcionario">ID do produto que será vendido</param>
        /// <param name="funcionario">Quantidade do produto que será vendido</param>
        /// <returns>Preço calculado</returns>
        public double CalcularPreco(int ID, int Quantidade)
        {
            EstoqueService servico = new EstoqueService();
            double precoProduto = servico.ListarProdutosDisponiveisCache().Where(i => i.ID == ID).FirstOrDefault().PrecoVenda;

            return precoProduto * Quantidade;

        }

        /// <summary>
        /// Serviço de cadastrao de uma venda
        /// </summary>
        /// <returns>True se foi inserido ou false se nao</returns>
        public int CadastrarVenda(int NumeroApartamento, int IDProduto, int Quantidade, bool JaEfetuado, double Preco)
        {

            FluxoHospedesService fluxo_Service = new FluxoHospedesService();
            EstoqueService servico_Estoque = new EstoqueService();

            //recupera o ID do fluxo
            Fluxo_Hospedes Fluxo = fluxo_Service.RecuperarFluxoHospedesPorApartamento(NumeroApartamento);
            string produto = servico_Estoque.ListarProdutosDisponiveisCache().Where(i => i.ID == IDProduto).FirstOrDefault().NomeProduto;

            string meio = "";
            if (Quantidade == 1)
            {
                meio = " unidade de ";
            }
            else
            {
                meio = " unidades de ";    
            }
            
            //Monta a conta gasta
            Conta contaAtual = new Conta()
            {
                ID = Fluxo.ID,
                Descricao = Quantidade + meio + produto,
                Preco = Preco,
                Data = DateTime.Now,
                isProduto = true,
                Pagamento = JaEfetuado

            };

            if (repositorio.CadastrarVenda(contaAtual))
            {
                if (servico_Estoque.VenderProduto(Quantidade, IDProduto))
                {
                    //verifica se o hóspede perdite receber SMS
                    if (Fluxo.SMSVenda)
                    {
                        string SMS;

                        //verifica se já foi efetuado o pagamento
                        if (JaEfetuado)
                        {
                            SMS = "SIGHO Informa: Compra de " + Quantidade + meio + produto + " no valor de " + Preco +
                            " Reais registrada em " + DateTime.Today.ToString("dd/MM/yy") + ". Pagamento efetuado!";
                        }
                        else
                        {
                            SMS = "SIGHO Informa: Compra de " + Quantidade + meio + produto + " no valor de " + Preco +
                            " Reais registrada em " + DateTime.Today.ToString("dd/MM/yy") + ". Pagamento pendente!";
                        }


                        string celular = Fluxo.Celular;

                        //chama o serviço que envia o SMS
                        ExternalService servico_Externo = new ExternalService();
                        if (servico_Externo.EnviarSMS(SMS, celular))
                            return 2;
                        else
                            return 3;
                    }
                    return 1;
                }
            }

            return 0;

        }
        /// <summary>
        /// Serviço de cadastrao de uma venda
        /// </summary>
        /// <returns>True se foi inserido ou false se nao</returns>
        public int CancelarVenda(DateTime Data, string Venda, double Preco, int Apartamento)
        {
            EstoqueService servico_Estoque = new EstoqueService();
            string produto = "";
            int quantidade = 0;

            for (int i = 0; i < Venda.Length; i++)
            {
                if (Venda[i] == ' ')
                {
                    int.TryParse(Venda.Substring(0, i), out quantidade);
                    produto = Venda.Substring(i + 1);
                    break;
                }
            }

            FluxoHospedesService fluxo_Service = new FluxoHospedesService();

            //recupera o ID do fluxo
            Fluxo_Hospedes Fluxo = fluxo_Service.RecuperarFluxoHospedesPorApartamento(Apartamento);
           

            //cancela a venda do produto
            if (repositorio.CancelarVenda(Data, Venda, Preco))
            {
                //incrementa o produto no estoque
                if (servico_Estoque.IncrementarEstoqueProduto(quantidade, produto))
                {
                    if (Fluxo.SMSVenda)
                    {
                        string SMS;
                        SMS = "SIGHO Informa: Compra de " + Venda + " no valor de " + Preco +
                            " Reais registrada em " + Data.ToString("dd/MM/yy") + " foi cancelada!";                        


                        string celular = Fluxo.Celular;

                        //envia o SMS
                        ExternalService servico_Externo = new ExternalService();

                        if (servico_Externo.EnviarSMS(SMS, celular))
                            return 2;
                        else
                            return 3;
                    }
                  
                    return 1;
                }

            }
            return 0;
        }

    }
}